#pragma once
#include <iostream>
#include <vector>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <thread>
#include <atomic>
#include <unordered_map>
#include <string>
#include <utility>

class EchoClient {
public:
    EchoClient(const char* ip, int port, int numConnections);
    ~EchoClient();
    bool init();     // 初始化epoll实例
    void start();    // 启动（创建连接+事件循环）

private:
    void createConnections(); // 批量创建连接
    void eventLoop();         // 事件循环（处理连接和Echo）
    int connectToServer();    // 创建单个连接并加入epoll
    void setNonBlocking(int fd); // 设置socket为非阻塞模式
    bool checkConnectSuccess(int fd); // 检查连接是否成功
    int recvAll(int fd, char* buffer, int expectedLen); // 完整接收数据

    std::string ip_;          // 服务器IP
    int port_;                // 服务器端口
    int numConnections_;      // 要创建的连接数
    int epollFd_;             // epoll实例fd
    std::atomic<int> connected_{0}; // 已成功连接数
    std::atomic<int> echoed_{0};    // 已完成Echo数
    static const int MAX_EVENTS = 1024;  // 单次epoll_wait最大事件数
    static const int BUFFER_SIZE = 1024; // 读写缓冲区大小
    // static const std::string TEST_DATA;  // 测试数据
    int increment = 0;
};
